package negocio.bd;

import base.Empleado;
import java.sql.SQLException;
import java.util.ArrayList;
import utiles.ConexionBD;
import utiles.ConversorFecha;
import utiles.Logger;

/**
 * Clase para el manejo de los datos relativos a los tecnicos en la base de datos.
 * @author Efren
 */
public class BDTecnicos {
    public static final String idEmpleado = "idEmpleado";
    public static final String nombre = "nombre";
    public static final String primerApellido = "apellido1";
    public static final String segundoApellido = "apellido2";
    public static final String fechaAlta = "fechaAlta";
    public static final String fechaBaja = "fechaBaja";
    public static final int buscarPorDNI = 1;
    public static final int buscarPorNombre = 2;
    public static final int buscarPorPrimerApellido = 3;
    public static final int buscarPorSegundoApellido = 4;
    public static final int buscarPorFechaAlta = 5;
    public static final int ASC = 1;
    public static final int DESC = 2;
    
    public static Empleado[]  buscar(int campoBusqueda, String busqueda, int orden, boolean exacta){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Empleado> tecnicos = new  ArrayList<>(0);
        String query = "SELECT * FROM `gestionTienda`.`Empleados` ";
        switch (campoBusqueda){
            case buscarPorNombre:
                query += "WHERE " + nombre + " like " + busqueda + "% ORDER BY " + nombre;
                break;
            case buscarPorPrimerApellido:
                query += "WHERE " + primerApellido + " like " + busqueda + "% ORDER BY " + primerApellido;
                break;
            case buscarPorSegundoApellido:
                query += "WHERE " + segundoApellido + " like " + busqueda + "% ORDER BY " + segundoApellido;
                break;
            case buscarPorFechaAlta:
                query += "WHERE " + fechaAlta + " like " + busqueda + "% ORDER BY " + fechaAlta;
                break;
            default:
                query += "WHERE " + idEmpleado + " like " + busqueda + "% ORDER BY " + idEmpleado;
        }
        //Si la busqueda a de ser exacta quitar like y % de la consulta
        if (exacta){
            query = query.replaceAll("like", "=");
            query = query.replace("%", "");
        }
        if (orden == DESC){
            query += " DESC";
        } else {
            query += " ASC";
        }
        try {
            java.sql.Statement statement = db.createStatement();
            java.sql.ResultSet res = statement.executeQuery(query);
            while (res.next()){
                Empleado temp = new Empleado();
                temp.setIdEmpleado(res.getInt(idEmpleado));
                temp.setNombre(res.getString(nombre));
                temp.setPrimerApellido(res.getString(primerApellido));
                temp.setSegundoApellido(res.getString(segundoApellido));
                temp.setFechaAlta(ConversorFecha.obtenerFecha(res.getString(fechaAlta)));
                temp.setFechaBaja(ConversorFecha.obtenerFecha(res.getString(fechaBaja)));
                tecnicos.add(temp);
            }
            return tecnicos.toArray(new Empleado[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }
        return null;
    }
    public static Empleado obtener(int idTecnico){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Empleados` WHERE " + BDTecnicos.idEmpleado + " = " + idTecnico);
            while (res.next()){
                Empleado temp = new Empleado();
                temp.setIdEmpleado(res.getInt(idEmpleado));
                temp.setNombre(res.getString(nombre));
                temp.setPrimerApellido(res.getString(primerApellido));
                temp.setSegundoApellido(res.getString(segundoApellido));
                temp.setFechaAlta(ConversorFecha.obtenerSoloFecha(res.getString(fechaAlta)));
                temp.setFechaBaja(ConversorFecha.obtenerSoloFecha(res.getString(fechaBaja)));
                return temp;
            }
        }catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean existe(int idTecnico){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Empleados` WHERE " + BDTecnicos.idEmpleado + " = " + idTecnico);
            if (res.next()){
                return true;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }
    public static Empleado[] obtenerTodos(){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Empleado> tecnicos = new ArrayList<>(0);
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Empleados`");
            while (res.next()){
                Empleado temp = new Empleado();
                temp.setIdEmpleado(res.getInt(idEmpleado));
                temp.setNombre(res.getString(nombre));
                temp.setPrimerApellido(res.getString(primerApellido));
                temp.setSegundoApellido(res.getString(segundoApellido));
                temp.setFechaAlta(ConversorFecha.obtenerSoloFecha(res.getString(fechaAlta)));
                String f= res.getString(fechaBaja);
                if (f != null){
                    temp.setFechaBaja(ConversorFecha.obtenerSoloFecha(f));
                }
                
                tecnicos.add(temp);
            }
            return tecnicos.toArray(new Empleado[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
        public static Empleado[] obtenerParticipanTarea(long idTarea){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Empleado> tecnicos = new ArrayList<>(0);
        try {
            java.sql.Statement select = db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Empleados` INNER JOIN `gestionTienda`. `Participan` ON Empleados.idEmpleado = Participan.idEmpleado WHERE idTarea = " + idTarea);
            while (res.next()){  
                Empleado temp = new Empleado();
                temp.setIdEmpleado(res.getInt(idEmpleado));
                temp.setNombre(res.getString(nombre));
                temp.setPrimerApellido(res.getString(primerApellido));
                temp.setSegundoApellido(res.getString(segundoApellido));
                temp.setFechaAlta(ConversorFecha.obtenerSoloFecha(res.getString(fechaAlta)));
                String f= res.getString(fechaBaja);
                if (f != null){
                    temp.setFechaBaja(ConversorFecha.obtenerSoloFecha(f));
                }
                
                tecnicos.add(temp);
            }
            return tecnicos.toArray(new Empleado[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static boolean insertar(Empleado tecnico){
        if (!existe(tecnico.getIdEmpleado())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`. `Empleados` VALUES (?,?,?,?,?,?)");
                insert.setInt(1, tecnico.getIdEmpleado());
                insert.setString(2, tecnico.getNombre());
                insert.setString(3, tecnico.getPrimerApellido());
                insert.setString(4, tecnico.getSegundoApellido());
                insert.setString(5, ConversorFecha.formatearSoloFecha(tecnico.getFechaAlta()));
                insert.setString(6, ConversorFecha.formatearSoloFecha(tecnico.getFechaBaja()));
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    
        public static boolean insertarSinFechaBaja(Empleado tecnico){
        if (!existe(tecnico.getIdEmpleado())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`. `Empleados` VALUES (?,?,?,?,?)");
                insert.setInt(1, tecnico.getIdEmpleado());
                insert.setString(2, tecnico.getNombre());
                insert.setString(3, tecnico.getPrimerApellido());
                insert.setString(4, tecnico.getSegundoApellido());
                insert.setString(5, ConversorFecha.formatearSoloFecha(tecnico.getFechaAlta()));
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    
    public static boolean actualizar(Empleado tecnico){
        if (existe(tecnico.getIdEmpleado())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement update = db.prepareStatement("UPDATE `gestionTienda`.`Empleados` SET " + nombre + " = ? " + primerApellido + " = ? "+ segundoApellido + " = ? " + fechaAlta + " = ? " + fechaBaja +" = ? WHERE " + BDTecnicos.idEmpleado + " = ?");
                update.setString(1, tecnico.getNombre());
                update.setString(2, tecnico.getPrimerApellido());
                update.setString(3, tecnico.getSegundoApellido());
                update.setString(4, ConversorFecha.formatearSoloFecha(tecnico.getFechaAlta()));
                update.setString(5, ConversorFecha.formatearSoloFecha(tecnico.getFechaBaja()));
                update.setInt(6,tecnico.getIdEmpleado());
                if (update.executeUpdate()==1){
                    return true;
                }
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
}
